perm filename P2LOAD.FAI[SS,SYS]1 blob sn#406948 filedate 1979-01-02 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	A B C D P ACWPRV JOBSAV JOBDDT P2SORG P2LOOP P2NUM HNGP2F JOBSYM P2SIZE NOREAD BUFLEN BLTLEN BUFFER BLTORG SAVORG DEFNAM DEFPPN BUFIOW FILNAM EXT PDLEN PDL START SEMILP NOSEMI SEMICL NOPRG NOPPN OPENIT WIN WINOUT RSKPSP SKIPSP GETWRD GETWR1 GETWR2 GETWR3 GETRT GETRT1 GETRT2 GETRT3 SYNTAX NOACW NOFILE IOERR
C00010 ENDMK
C⊗;
;A B C D P ACWPRV JOBSAV JOBDDT P2SORG P2LOOP P2NUM HNGP2F JOBSYM P2SIZE NOREAD BUFLEN BLTLEN BUFFER BLTORG SAVORG DEFNAM DEFPPN BUFIOW FILNAM EXT PDLEN PDL START SEMILP NOSEMI SEMICL NOPRG NOPPN OPENIT WIN WINOUT RSKPSP SKIPSP GETWRD GETWR1 GETWR2 GETWR3 GETRT GETRT1 GETRT2 GETRT3 SYNTAX NOACW NOFILE IOERR

TITLE P2LOAD PROGRAM TO LOAD P2SYS INTO P2 MEMORY

A←1
B←2
C←3
D←4
P←17

ACWPRV←←40
JOBSAV←←73			;LAST LOCATION NOT SAVED IN DUMP FILE
JOBDDT←←74			;LOCATION OF DDT'S ADDRESS
P2SORG←←200			;FIRST LOCATION WE SHOULD LOAD FROM P2SYS FILE
P2LOOP←←101			;HERE IS WHERE P2 WILL LOOP WAITING FOR US
P2NUM←←210			;ZERO THIS TO TELL RUNNING P2 TO SHUT DOWN
HNGP2F←←212			;SETOM THIS TO TELL P1 TO FLUSH ACTIVE P2 DEVICES
JOBSYM←←116			;WHERE TO FIND SYMBOL TABLE POINTER
P2SIZE←←400			;HOW MANY PAGES OF P2 CORE

OPDEF P2UUO [CALLI 400125]	;JUST UNTIL TOMORROW

NOREAD←←<P2SORG-JOBSAV>-1	;NUMBER OF WORDS OF DMP FILE WE IGNORE
BUFLEN←←<NOREAD+177>&777600	;LENGTH OF BUFFER WE READ INTO
BLTLEN←←BUFLEN-NOREAD		;HOW MANY WORDS WE HAVE TO BLT INTO P2 CORE
BUFFER:	BLOCK BUFLEN		;HERE IS THE BUFFER
BLTORG←←BUFFER+NOREAD		;FIRST WORD WE CARE ABOUT
SAVORG←←BUFFER-<JOBSAV+1>	;ADDR X IN CORE IMAGE IS WORD SAVORG+X HERE

DEFNAM:	SIXBIT /P2SYS DMP/
DEFPPN:	SIXBIT /  SSYS/

BUFIOW:	IOWD BUFLEN,BUFFER
	0
FILNAM:	0
EXT:	0

PDLEN←←10
PDL:	BLOCK PDLEN

START:	RESET
	MOVE P,[IOWD PDLEN,PDL]
	OUTSTR [ASCIZ /
/]				;STUPID MONITOR
	MOVSI A,ACWPRV		;MUST BE ABLE TO WRITE P2 CORE
	SETPRV A,
	P2UUO 4,		;GET P2 MEMORY AS OUR UPPER
	 JRST NOACW
	RESCAN			;LOOK FOR NONSTANDARD FILENAME
SEMILP:	INCHSL A		;READ A CHAR SEARCHING FOR SEMICOLON
	 JRST NOSEMI		;NOTHING TO READ, USE STANDARD FILE
	CAIN A,";"
	JRST SEMICL		;GOT ONE, NOW READ FILENAME
	CAIE A,175
	CAIN A,12
	JRST NOSEMI		;END OF LINE WITH NO SEMI
	JRST SEMILP		;ELSE KEEP LOOKING

NOSEMI:	DMOVE A,DEFNAM
	MOVE D,DEFPPN
	JRST OPENIT		;USE STANDARD FILENAME

SEMICL:	PUSHJ P,GETWRD		;READ FILENAME
	JUMPN B,.+2		;MUST BE A FILENAME
	MOVE B,DEFNAM		;ELSE WE USE THE DEFAULT
	MOVEM B,FILNAM
	MOVSI B,'DMP'
	CAIN A,"."		;EXPLICIT EXTENSION?
	PUSHJ P,GETWRD		;YES, READ IT
	MOVEM B,EXT
	MOVE D,DEFPPN		;DEFAULT PPN
	CAIE A,"["		;EXPLICIT PPN?
	JRST NOPPN		;NO, USE STANDARD
	MOVEI D,0
	DSKPPN D,		;GET DEFAULT PPN
	PUSHJ P,GETRT		;GET PRJ
	JUMPE B,.+2		; IF ANY
	HRL D,B
	CAIE A,","		;EXPLICIT PRG?
	JRST NOPRG		;NO
	PUSHJ P,GETRT		;YES, READ IT
	JUMPE B,.+2
	HRR D,B
NOPRG:	CAIN A,"]"
	PUSHJ P,RSKPSP		;SKIP BRACKET IF ANY
NOPPN:	CAIE A,12
	JRST SYNTAX		;MUST END WITH CRLF
	DMOVE A,FILNAM		;GET NAME AND EXT
OPENIT:	INIT 17			;OPEN THE DISK
	 'DSK   '
	 0
	 JRST NOFILE
	LOOKUP A		;FIND THE FILE
	 JRST NOFILE		;OOPS
	SETZM 400000+P2NUM	;TELL P2 TO SHUT DOWN WHILE WE LOAD IT
	SETOM 400000+HNGP2F	;TELL P1 TO SHUT DOWN ACTIVE P2 DEVICES
	HLRES D			;NEGATIVE LENGTH OF FILE
	IN BUFIOW		;READ FIRST PART OF FILE
	JRST .+2		;READ OK
	 JRST IOERR		;OOPS
	MOVE A,[BLTORG,,400000+P2SORG]
	BLT A,400000+P2SORG+BLTLEN-1
	MOVEI A,<P2SIZE⊗9>-1	;HIGHEST LOCATION IN P2 CORE
	MOVEM A,400037		;DDT JOBREL
	MOVE A,SAVORG+JOBSYM	;JOBSYM FROM FILE
	MOVEM A,400036		;SAVE HERE FOR DDT
	MOVE A,SAVORG+JOBDDT	;JOBDDT FROM FILE
	MOVEM A,400000+JOBDDT	;SAVE FOR P2INI
	HRLZI A,BUFLEN(D)	;LENGTH OF FILE TO GO
	HRRI A,400000+P2SORG+BLTLEN-1
	MOVEI B,0		;END OF IOWD LIST
	IN A			;READ REST DIRECTLY INTO P2 CORE
	JRST WIN		;DONE!
	 OUTSTR [ASCIZ /Error in second part of read.  Beware!
/]
	EXIT

WIN:	OUTSTR [ASCIZ /P2 loaded... /]
	MOVE A,[JRST 204]	;SEND P2 TO P2INI
	MOVEM A,400000+P2LOOP	;IT'S BEEN JRSTING POINT HERE
	MOVEI A,2
	SLEEP A,		;WAIT A WHILE
	MOVE A,400000+P2NUM
	MOVEI B,[ASCIZ /but needs to be started, at 204.
/]
	JUMPE A,WINOUT
	MOVEI B,[ASCIZ /and running.
/]
	AOJE A,WINOUT
	MOVEI B,[ASCIZ /but not with a P2 system!
/]
WINOUT:	OUTSTR (B)
	EXIT

RSKPSP:	INCHWL A		;SKIP TO A REAL CHAR
SKIPSP:	CAIN A,15		;IGNORE CR
	JRST RSKPSP
	CAIE A,40		;IGNORE SPACE
	CAIN A,11		;IGNORE TAB
	JRST RSKPSP
	POPJ P,

GETWRD:	PUSHJ P,RSKPSP		;SKIP PUNCTUATION CHAR BEFORE READING NAME
	MOVEI B,0
	MOVE C,[POINT 6,B]
GETWR1:	CAILE A,140
	SUBI A,40		;LC TO UC
	CAIL A,"A"		;HO HUM
	CAILE A,"Z"
	JRST GETWR3
GETWR2:	SUBI A,40
	TRNN B,77
	IDPB A,C
	INCHWL A
	JRST GETWR1

GETWR3:	CAIL A,"0"
	CAILE A,"9"
	JRST SKIPSP
	JRST GETWR2

GETRT:	PUSHJ P,RSKPSP		;SKIP PUNCTUATION CHAR BEFORE READING NAME
	MOVEI B,0
	MOVE C,[POINT 6,B]
GETRT1:	CAILE A,140
	SUBI A,40		;LC TO UC
	CAIL A,"A"		;HO HUM
	CAILE A,"Z"
	JRST GETRT3
GETRT2:	LSH B,6
	ADDI B,-40(A)
	INCHWL A
	JRST GETRT1

GETRT3:	CAIL A,"0"
	CAILE A,"9"
	JRST SKIPSP
	JRST GETRT2

SYNTAX:	CLRBFI			;SORRY
	OUTSTR [ASCIZ /Error in filename, try again.
/]
	EXIT

NOACW:	OUTSTR [ASCIZ /Can't write P2 memory!  (Maybe NOP2 set, maybe no ACW.)
/]
	EXIT

NOFILE:	OUTSTR [ASCIZ /Can't look up file!
/]
	EXIT

IOERR:	OUTSTR [ASCIZ /Error on first read.  P2 core not modified.
/]
	EXIT

	END START